package c07运行环境与常用类;

import java.util.*;

/**
 * 共同点：都可以储存和操作字符串。
 * 区别：
 * 1、String是不可变字符串，即储存的内容不可变；StringBuffer和StringBuilder是可变字符串，即内容可变。因此，
 * 如果要动态修改字符串，应该用后两者，修改完后，后两者都可以用toString方法转换为String对象。
 * 2、前者重写了equals和hashCode方法，可以按字符串序列比较字符串是否相同并且可以正确储存到HashSet和
 * HashMap这些需要用到hashCode的集合里；后两者则没有~且都不能~。
 * <p>
 * StringBuffer和StringBuilder的构造器、方法等和用法基本相同。区别在于：前者线程安全后者不安全，
 * 因此后者性能略高。
 *
 * @author 炜sama
 */
public class String和StringBuffer和StringBuilder {

	public static void main(String[] args) {

		String s = new String("abc");
		String s2 = new String("abc");
		System.err.println(s.equals(s2));//true！因为String有实现equals方法！
		System.err.println(s.hashCode());
		System.err.println(s2.hashCode());//hashCode同上！

		StringBuffer sb = new StringBuffer("abc");
		StringBuffer sb2 = new StringBuffer("abc");
		System.err.println(sb.equals(sb2));//false！因为StringBuffer没有实现equals方法！
		System.err.println(sb.hashCode());//两者hashCode不同！因为它们使用的是Object的hashCode方法，那个
		System.err.println(sb2.hashCode());//方法是利用地址来算hashCode值的~

		StringBuilder sbd = new StringBuilder("abc");
		StringBuilder sbd2 = new StringBuilder("abc");
		System.err.println(sbd.equals(sbd2));//false！因为StringBuilder没有实现equals方法！

		System.err.println(s.equals(sb));//false
		System.err.println(s.equals(sbd));//false
		System.err.println(sb.equals(sbd));//false

		Map map = new HashMap();
		//因为StringBuffer没有覆盖equals和hashCode方法，因此下面put进了两个不同的字符串！
		map.put(s, "s");
		map.put(s2, "s2");
		map.put(sb, "sb");
		map.put(sb2, "sb2");
		System.err.println(map.get(s));//s2！可见后来put进去的s2替换了原来的s~
		System.err.println(map.get(s2));//s2！
		System.err.println(map.get(sb));//sb！
		System.err.println(map.get(sb2));//sb2！后者不会覆盖前者，而是放到了不同的地方~
	}
}
